Prerequisites

MATLAB의 조건문에 대해 잘 이해하기 위해서는 아래의 내용에 대해 알고 오시는 것이 좋습니다.

Introduction

어린 시절 이휘재의 인생극장이라는 TV 프로그램이 있었다. (요즘 사람들은 잘 모를지도…) 이 프로그램의 설정은 이휘재가 살다가 어떤 선택의 기로에 서게 되고 “그래! 결심했어!” 라는 대사와 함께 각각의 선택에 대한 미래를 확인해나간다는 것이다. 이 때, 조건들 중 돈이냐 양심이냐와 같은 도덕적인 조건들이 많았던 것 같다.

아무튼, 인생이 결정의 연속이듯이 프로그래밍도 조건에 따른 선택들로 명령문들을 전개해나갈 수 있다. 코딩을 한다는 것은 어떻게 컴퓨터에게 일련의 명령을 내릴 것인가에 관한 것이라고 할 수 있기 때문에, 특정 조건에선 어떤 선택을 내리게 할지 컴퓨터가 자동으로 선택할 수 있게 한다면, 아주 편리한 자동 제어를 수행할 수 있게 된다.

다양한 조건문 구조들

if-end 조건문

일단, MATLAB에서 제어문(control statements)의 구조는 제어 문구와 end를 수미상관식으로 이루는 구조를 갖는다. 가령 if문의 경우 단순히 if를 사용하는 것이 아니라 if 뒤에 쌍으로 잡히는 end 가 존재해야 한다. 이 부분은 C, JAVA, Python 과 같은 다른 언어들과 대비되는 부분이기도 하다. 그렇지만, 제어문구-end의 구조를 가지는 언어들도 드물지만은 않다1.

if-end 조건문을 그림으로 나타내면 아래와 같이 표시할 수도 있다.


그림 1. if-end 조건문의 구조

그림 1 왼쪽의 순서도를 이용해 설명하자면 프로그래밍 명령어들이 순서대로 수행되다가 if문을 만나면 if문의 조건이 참인지 거짓인지를 판단하게 된다. 만약, 조건이 참인 경우 if-end 문 내부에 있는 명령어 그룹들이 실행되고 end쪽으로 빠져나가게 된다. 반대로 조건이 거짓이었다면 if-end 문 내부의 명령어들은 실행되지 않고 바로 end쪽으로 나가게 된다.

조건문의 예를 들어 만약 배가 고프면 밥을 먹고 일을 하고, 그렇지 않으면 그냥 일을 하는 상황을 생각해보자. 이를 MATLAB으로 쓰면 아래와 같이 쓸 수 있다.

hungry = true;

if hungry
    disp('밥을 먹는다');
end

disp('일을 한다.');

위 예시에서는 hungry에 true를 넣었기 때문에 “밥을 먹는다.”가 출력되고 바로 이어서 “일을 한다.”가 출력된다. 만약 hungry에 false를 넣어주면 “일을 한다.”만 출력되는 것을 알 수 있다.

if-else-end 조건문

if-else-end 구조에서는 if-end문과 다르게 else 문 뒤에 따르는 명령이 하나 더 포함되게 된다. (참고로 “else”는 “엘스”라고 읽는다.) 다시 말해, if-else-end 구조에서는 if 조건을 만족했을 때 수행되는 명령어와 if 조건을 만족하지 못했을 때 수행되는 명령어가 구분되어 있다. 여기서 if 조건을 만족하지 못했을 때 수행되는 명령어는 else와 end 사이에 존재하게 된다. 아래의 그림을 통해 이 사실을 더 시각적으로 이해할 수 있다.


그림 2. if-else-end 조건문의 구조

예를 들어 만약 밥이 땡기면 점심으로 백반을 먹고, 그렇지 않으면 햄버거를 먹은 뒤 일하러 가는 상황을 생각해볼 수 있다. 이를 MATLAB으로 쓰면 아래와 같이 쓸 수 있다.

want_rice = true;

if want_rice
    disp('오늘의 점심은 백반');
else
    disp('오늘의 점심은 햄버거');
end

disp('밥을 다먹고 일하러 갑니다.');

위 예시에서는 “want_rice”에 true를 넣었기 때문에 “오늘의 점심은 백반”이 출력되고 바로 이어서 “밥을 다먹고 일하러 갑니다.”가 출력된다. 만약 “want_rice”에 false를 넣어주면 “오늘의 점심은 햄버거”가 출력된 뒤 “밥을 다먹고 일하러 갑니다”가 출력되는 것을 알 수 있다.

if-elseif-else-end 조건문

조건문을 사용하다보면 여러가지 조건이 차례대로 분기될 수 있다. 이럴때는 “elseif” 구문을 중간 중간에 사용할 수 있다. 아래의 그림을 통해 시각적으로 “elseif” 가 포함되는 조건문을 생각해보자.


그림 3. if-elseif-else-end 조건문의 구조

예를 들어 오늘 점심으로 밥이 땡기지 않을 때, 라면이 땡긴다면 라면집으로 가고 위 조건 둘 다 만족하지 못하는 경우에는 햄버거를 먹으러 갈 수도 있다.

want_rice = false;
want_ramen = true;

if want_rice
    disp('오늘의 점심은 백반');
elseif want_ramen
    disp('오늘의 점심은 라면');
else
    disp('오늘의 점심은 햄버거')
end

disp('밥을 다먹고 일하러 갑니다.');

위 예시에서는 “want_rice”에 false, “want_ramen”에는 true를 넣었기 때문에 “오늘의 점심은 라면”이 출력된 뒤 “밥을 다먹고 일하러 갑니다”가 따라 출력되는 것을 알 수 있다.

좀 더 실전적인 예시를 들어보자면 아래와 같이 판별식을 구동하는 프로그램을 작성할 수 있을 것이다. 아래 프로그램에서는 roots 함수를 이용해 2차 방정식의 근을 계산했다.

clear;
% 아래의 2차 함수에 대한 판별식을 가동하는 프로그램
% ax^2 + bx + c = 0
a= 1; % x^2의 계수
b= -3; % x의 계수
c= 2; % 상수 계수

D = b^2-4*a*c;

my_roots = roots([a b c]);
if (D>0)
    sprintf('두 개의 실근')
elseif (D==0)
    sprintf('중근')
else
    sprintf('허근')
end

my_roots

위 코드를 수행해보면 “두 개의 실근”이라는 글자와 함께 2, 1 이라는 두 개의 근을 출력해주는 것을 알 수 있다.

  1. 가령 Liquid 같은 언어는 주석 마저도 comment와 endcomment로 수미상관 구조를 가져야 한다.